Java package, import

Java package, import

package

package作用

Java引入包(package)机制,提供了类的多层命名空间,用于解决类的命名冲突、类文件管理等问题。

Java允许将一组功能相关的类放在同一个package下,从而组成逻辑上的类库单元。如果希望把一个类放在指定的包结构下,我应该在Java源程序的第一个非注释行放置如下格式的代码:

package packagename;

一旦在Java源文件中使用了这个package语句,就意味着该源文件里定义的所有类都属于这个包。位于包中的每个类的完整类名都应该是包名和类名的组合,如果其他人需要使用该包下的类,也应该使用包名加类名的组合。

javac -d . Hello.javajavac Hello.java 的区别?

1
2
3
4
5
6
7
8
package lee;
public class Hello
{
  public static void main(String[] args)
{
  System.out.println("Hello World!");
}
}

-d选项本来用于设置编译生成的class文件的保存位置,这里指定将生成的class文件放在当前路径下。使用该命令编译后,当前路径下生成一个名为lee的文件夹,该文件夹下则有一个Hello.class文件。

如果直接使用javac Hello.java命令编译,将会在当前路径下生成一个Hello.class文件,而不会生成lee文件夹。

同一个包中的类必须位于同一个文件夹吗?

可以不在同一个文件夹。例如lee.Person和lee.PersonTest两个类可一个在C盘一个在D盘,只要让CLASSPATH环境变量包含这两个路径即可。

包名如何起?

包名一般全是小写字母,由一个或多个有意义的单词连缀而成。为了在开发中避免包名和类名同时重复的情况,Oracle建议使用公司Internet域名倒写来作为包名,例如Internet域名是crazyit.org,则该公司的所有类都放在org.crazyit包及其子包下。
域名倒写.项目名.模块名.组件名

同一个包下的类互相访问时可以不加包前缀吗?
可以。

父包和子包互相访问时可以不加包前缀吗?
不可以,必须加包前缀。

import

import关键字

正如上面看到的,如果需要使用不同包中的其他类时,总是需要使用该类的全名,这是一件繁琐的事情。为了简化编程,Java引入了import关键字,import关键字可以向某个java文件只能给导入指定包层次下的某个类或全部类,import语句应该出现在package语句之后、类定义之前。一个Java源文件只能包含一个package语句,但可以包含多个import语句,多个import语句用于导入多个包层次下的类。

导入单个类:import package.subpackage…ClassName;
导入全部类:import package.subpackage…*;

上面的(*)只能代表类,不能代表包。

使用方式

为了能够使用某一个包的成员,我们需要在 Java 程序中明确导入该包。使用“import”语句可完成此功能。在 java 源文件中 import 语句应位于 package 语句之后,所有类的定义之前,可以没有,也可以有多条,其语法格式为:
import package1[.package2…].(classname|*);
java 运行时环境将到 CLASSPATH + package1.[package2…]路径下寻找并载入相应的字节码文件 classname.class。“*”号为通配符,代表所有的类。也就是说 import 语句为编译器指明了寻找类的途径。

例,使用 import 语句引入类程序:TestPackage.java

1
2
3
4
5
6
7
import p1.Test;    //或者 import p1.*;
public class TestPackage {
public static void main(String args[]) {
Test t = new Test(); // Test 类在 p1 包中定义
t.display();
}
}

java 编译器默认为所有的 java 程序引入了 JDK 的 java.lang 包中所有的类(import java.lang.*;),其中定义了一些常用类:System、String、Object、Math 等。因此我们可以直 接使用这些类而不必显式引入。但使用其它非无名包中的类则必须先引入、后使用。

Java 类搜寻方式

程序中的 import 语句标明要引入 p1 包中的 Test 类,假定环境变量 CLASSPATH 的值为“.;C:\jdk6\lib;D:\ex”,java 运行环境将依次到下述可能的位置寻找并载入该字节码文件 Test.class:
.\p1\Test.class
C:\jdk6\lib\p1\Test.class
D:\ex\p1\Test.class
“.”代表当前路径,如果在第一个路径下就找到了所需的类文件,则停止搜索。否则依次搜索后续路径,如果在所有的路径中都未找到所需的类文件,则编译或运行出错。

Java的常用包

Java的核心类都放在java这个包及其子包下,Java扩展的许多类都放在javax包及其子包之下。这些实用类也就是前面所说的API(应用程序接口),Oracle按这些类的功能分别放在不同的包下。下面几个包是Java中的常用包。

java.lang:这个包下包含了Java语言的核心类,如Sting、Math、System、和Tread类等,使用这个包下的类无需使用import语句导入,系统会自动导入这个包下的所有类。
java.util:这个包下包含了Java的大量工具类/接口和集合框架类/接口,例如Arrays和List、Set等。
java.net:这个包下包含了一些Java网络编程相关的类/接口。
java.io:这个包下包含了一些Java输入/输出相关的类/接口。
java.text:这个包下包含了一些Java格式化相关的类。
java.sql:这个包下包含了一些Java进行JDBC数据库编程相关的类/接口。
java.awt:这个包下包含了抽象窗口工具集(Abstract Window Toolkits)的相关类/接口,这些类主要用于构建图形用户界面(GUI)程序。
java.swing:这个包下包含了Swing图形用户界面编程的相关类/接口,这些类可用于构建平台无关的CUI程序。

转自: Java package详解